package com.ynet.middleground.user.model;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneOffset;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ynet.middleground.user.bean.SendSmsReq;
import com.ynet.middleground.user.dao.SmsLogMapper;
import com.ynet.middleground.user.entity.SmsLog;
import com.ynet.middleground.user.external.sms.SmsApiUri;
import com.ynet.middleground.user.external.sms.SmsConfig;

/**
 * SmsLodModel 短信记录处理
 *
 * @author suremotoo
 * @date 2022/12/21 22:07
 */
@Component
public class SmsLogModel extends ServiceImpl<SmsLogMapper, SmsLog> {

    @Autowired
    private SmsConfig smsConfig;

    /**
     * 发短信落库记录
     * 
     * @param req 发送短信请求信息
     * @param smsLog 落库数据对象
     */
    @Transactional(rollbackFor = Exception.class)
    public void recordDb(SendSmsReq req, SmsLog smsLog) {
        smsLog.setMobile(req.getMobile());
        smsLog.setMsgContent(req.getContent());
        smsLog.setSignId(req.getSign());

        smsLog.setChargingNum(divideContent(req.getSign() + req.getContent()));
        smsLog.setUnitPrice(new BigDecimal(smsConfig.getUnitPrice()));

        smsLog.setSupplierName(SmsApiUri.SUPPLIER_NAME);
        smsLog.setChannel(req.getChannel());
        smsLog.setAppKey(req.getAppId());
        smsLog.setAppSecret(req.getAppSecret());
        smsLog.setFormatId(req.getFormatId());

        if (smsLog.getRequestTime() != null && smsLog.getResponseTime() != null) {
            Long milliSecondResp = smsLog.getResponseTime().toInstant(ZoneOffset.of("+8")).toEpochMilli();
            Long milliSecondReq = smsLog.getRequestTime().toInstant(ZoneOffset.of("+8")).toEpochMilli();
            long cost = milliSecondResp - milliSecondReq;
            smsLog.setCostTime((int)cost);
        }

        smsLog.setGmtCreate(LocalDateTime.now());
        smsLog.setCreateBy(req.getOperationUserId());
        smsLog.setGmtModified(LocalDateTime.now());
        smsLog.setModifiedBy(req.getOperationUserId());
        save(smsLog);

    }

    /**
     * 拆分短信条数
     * 
     * <pre>
     *     <=70 字为一条，>70 字按字数除以 67 计算，余数进一
     * 例： 1、 70 字 扣费 1 条
     *   2、 134 字 扣费 2 条 134/67=2
     *   3、 135 字 扣费 3 条 135/67=2.0149
     * </pre>
     * 
     * @param content 短信完整内容（包含签名）
     * @return 短信拆分条数
     */
    public static int divideContent(String content) {
        double length = content.length();
        if (length <= 70) {
            return 1;
        } else {
            double ceil = Math.ceil(length / 67);
            return (int)ceil;
        }
    }

    public static void main(String[] args) {
        System.out.println(divideContent("【测试】万分感谢上天让我遇见你，和我余生相知相守的人只能是你，我对你的心、情、爱是如此的清澈甘冽，味美甘甜，热情浓烈。醉倒在你的怀里是我愿。"));
        System.out.println(divideContent(
            "【测试2】万分感谢上天让我遇见你，和我余生相知相守的人只能是你，我对你的心、情、爱是如此的清澈甘冽，味美甘甜，热情浓烈。醉倒在你的怀里是我此生所愿，对你的依恋充满眼眸。和你相知相恋的那天起，我所做的一切改变，都只是为了你天长地久，白首偕老。，都只是为了你天长地久，白。"));
        System.out.println(divideContent(
            "【测试3】哦万分感谢上天让我遇见你，和我余生相知相守的人只能是你，我对你的心、情、爱是如此的清澈甘冽，味美甘甜，热情浓烈。醉倒在你的怀里是我此生所愿，对你的依恋充满眼眸。和你相知相恋的那天起，我所做的一切改变，都只是为了你天长地久，白首偕老。，都只是为了你天长地久，白。"));
    }

}
